package com.wjx.demo.`null`

class A {
    var s = "s"
}

class B {
    var a: A? = null
}

fun t(i: Int): String? {  //表示可能为null 或者抛异常
    when (i) {
        1 -> return null
        in 2..3 -> throw IllegalAccessException()
        else -> return "s"
    }
}

fun main(args: Array<String>) {
    var s: String? = "a"   //String? 表示 可允许赋值为null，否则不允许出现s=null的情况
    var b = B()
    println(b.a?.s)  //=null  ，因为此时a=null，直接返回null
    b.a?.let { println("let  " + it) }   //?.let 如果it是null，则忽略他
    b.a = A()
    println(b.a?.s) //=s  ，因为此时a！=null，所以可以获得s的值

    println(s?.length ?: -1)  // ?:保证   如果s=null，打印-1

    println(t(1)?.length ?: -1)
    println(t(4))

//    var a: String? = null
//    println(a!!.length)   //!! 对于null的会抛空指针异常

    var c: Int? = s as? Int   //as? 对于类型转化不成功的话返回null , as 是转化类型  ，把 s 转化成Int类型
    println(c)

    var list = listOf<Int?>(1, 2, null, 3)
    list.filter { i -> i != null }.forEach { println("i:" + it) }

}